package com.hw.sasso.controller;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.sign.SaSignUtil;
import cn.dev33.satoken.sso.SaSsoProcessor;
import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 * @program: sa-token-start
 * @author: hewei
 * @date: 2023-09-08 13:46
 *
 * Sa-Token-SSO Server端 Controller
 *
 * 授权：http://localhost:9000/sso/auth?redirect=https://www.hao123.com&mode=simple
 * 单点登录：http://localhost:9000/sso/doLogin?name=sa&pwd=123456
 * 单点注销：
 * 1、web页面：
 * http://localhost:9000/sso/signout?back=/sso/auth
 * 2、后端请求：
 * http://localhost:9000/sso/signout?loginId={value}&timestamp={value}&nonce={value}&sign={value}
 *
 *
 **/

@Slf4j
@RestController
public class SsoServerController {

    /*
     * SSO-Server端：处理所有SSO相关请求
     */
    @RequestMapping("/sso/*")
    public Object ssoRequest() {
        return SaSsoProcessor.instance.serverDister();
    }

    // 示例：获取数据接口（用于在模式三下，为 client 端开放拉取数据的接口）
    @RequestMapping("/sso/getData")
    public SaResult getData(HttpServletRequest request, String apiType, String loginId) {
        log.info("---------------- 客户端[{}]获取数据：{}", loginId,request.getRemoteAddr());
        log.info("apiType={},loginId={}" ,apiType,loginId);

        // 校验签名：只有拥有正确秘钥发起的请求才能通过校验
        SaSignUtil.checkRequest(SaHolder.getRequest());

        // 自定义返回结果（模拟）
        return SaResult.ok()
                .set("id", loginId)
                .set("name", "LinXiaoYu")
                .set("sex", "女")
                .set("age", 18);
    }

    // 获取指定用户的粉丝列表
    @RequestMapping("/sso/service")
    public List<Integer> service(HttpServletRequest request, Long loginId) {
        log.info("---------------- 客户端[{}]获取数据：{}", loginId,request.getRemoteAddr());

        // 校验签名：只有拥有正确秘钥发起的请求才能通过校验
        SaSignUtil.checkRequest(SaHolder.getRequest());

        List<Integer> list = Arrays.asList(10041, 10042, 10043, 10044);

        return list;
    }


}
